<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Transparent Inter-process Communication</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Transparent_Inter-process_Communication"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Transparent_Inter-process_Communication rootpage-Transparent_Inter-process_Communication skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Transparent Inter-process Communication</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1266661725">
/* start https://en.wikipedia.org/ */
.mw-parser-output .portalbox{padding:0;margin:0.5em 0;display:table;box-sizing:border-box;max-width:175px;list-style:none}.mw-parser-output .portalborder{border:1px solid var(--border-color-base,#a2a9b1);padding:0.1em;background:var(--background-color-neutral-subtle,#f8f9fa)}.mw-parser-output .portalbox-entry{display:table-row;font-size:85%;line-height:110%;height:1.9em;font-style:italic;font-weight:bold}.mw-parser-output .portalbox-image{display:table-cell;padding:0.2em;vertical-align:middle;text-align:center}.mw-parser-output .portalbox-link{display:table-cell;padding:0.2em 0.2em 0.2em 0.3em;vertical-align:middle}@media(min-width:720px){.mw-parser-output .portalleft{margin:0.5em 1em 0.5em 0}.mw-parser-output .portalright{clear:right;float:right;margin:0.5em 0 0.5em 1em}}
/* end https://en.wikipedia.org/ */
</style>
<style data-mw-deduplicate="TemplateStyles:r1251242444">
/* start https://en.wikipedia.org/ */
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style>
<p><b>Transparent Inter Process Communication</b> (<b>TIPC</b>) is an <a href="Inter-process_communication" title="Inter-process communication">inter-process communication</a> (IPC) service in Linux designed for cluster-wide operation.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> It is also known as <i>Cluster Domain Sockets</i>,<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> in contrast to the well-known <i>Unix Domain Socket</i> service; the latter working only on a single kernel.
</p>
<style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1246091330">
/* start https://en.wikipedia.org/ */
.mw-parser-output .sidebar{width:22em;float:right;clear:right;margin:0.5em 0 1em 1em;background:var(--background-color-neutral-subtle,#f8f9fa);border:1px solid var(--border-color-base,#a2a9b1);padding:0.2em;text-align:center;line-height:1.4em;font-size:88%;border-collapse:collapse;display:table}body.skin-minerva .mw-parser-output .sidebar{display:table!important;float:right!important;margin:0.5em 0 1em 1em!important}.mw-parser-output .sidebar-subgroup{width:100%;margin:0;border-spacing:0}.mw-parser-output .sidebar-left{float:left;clear:left;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-none{float:none;clear:both;margin:0.5em 1em 1em 0}.mw-parser-output .sidebar-outer-title{padding:0 0.4em 0.2em;font-size:125%;line-height:1.2em;font-weight:bold}.mw-parser-output .sidebar-top-image{padding:0.4em}.mw-parser-output .sidebar-top-caption,.mw-parser-output .sidebar-pretitle-with-top-image,.mw-parser-output .sidebar-caption{padding:0.2em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-pretitle{padding:0.4em 0.4em 0;line-height:1.2em}.mw-parser-output .sidebar-title,.mw-parser-output .sidebar-title-with-pretitle{padding:0.2em 0.8em;font-size:145%;line-height:1.2em}.mw-parser-output .sidebar-title-with-pretitle{padding:0.1em 0.4em}.mw-parser-output .sidebar-image{padding:0.2em 0.4em 0.4em}.mw-parser-output .sidebar-heading{padding:0.1em 0.4em}.mw-parser-output .sidebar-content{padding:0 0.5em 0.4em}.mw-parser-output .sidebar-content-with-subgroup{padding:0.1em 0.4em 0.2em}.mw-parser-output .sidebar-above,.mw-parser-output .sidebar-below{padding:0.3em 0.8em;font-weight:bold}.mw-parser-output .sidebar-collapse .sidebar-above,.mw-parser-output .sidebar-collapse .sidebar-below{border-top:1px solid #aaa;border-bottom:1px solid #aaa}.mw-parser-output .sidebar-navbar{text-align:right;font-size:115%;padding:0 0.4em 0.4em}.mw-parser-output .sidebar-list-title{padding:0 0.4em;text-align:left;font-weight:bold;line-height:1.6em;font-size:105%}.mw-parser-output .sidebar-list-title-c{padding:0 0.4em;text-align:center;margin:0 3.3em}@media(max-width:640px){body.mediawiki .mw-parser-output .sidebar{width:100%!important;clear:both;float:none!important;margin-left:0!important;margin-right:0!important}}body.skin--responsive .mw-parser-output .sidebar a>img{max-width:none!important}@media screen{html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle{background:transparent!important}html.skin-theme-clientpref-night .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle a{color:var(--color-progressive)!important}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-list-title,html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle{background:transparent!important}html.skin-theme-clientpref-os .mw-parser-output .sidebar:not(.notheme) .sidebar-title-with-pretitle a{color:var(--color-progressive)!important}}@media print{body.ns-0 .mw-parser-output .sidebar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><table class="sidebar nomobile nowraplinks hlist"><tbody><tr><th class="sidebar-title"><a href="Internet_protocol_suite" title="Internet protocol suite">Internet protocol suite</a></th></tr><tr><th class="sidebar-heading">
<a href="Application_layer" title="Application layer">Application layer</a></th></tr><tr><td class="sidebar-content">
<ul><li><a href="Border_Gateway_Protocol" title="Border Gateway Protocol">BGP</a></li>
<li><a href="Dynamic_Host_Configuration_Protocol" title="Dynamic Host Configuration Protocol">DHCP</a> (<a href="DHCPv6" title="DHCPv6">v6</a>)</li>
<li><a href="Domain_Name_System" title="Domain Name System">DNS</a></li>
<li><a href="File_Transfer_Protocol" title="File Transfer Protocol">FTP</a></li>
<li><a href="HTTP" title="HTTP">HTTP</a> (<a href="HTTP/3" title="HTTP/3">HTTP/3</a>)</li>
<li><a href="HTTPS" title="HTTPS">HTTPS</a></li>
<li><a href="Internet_Message_Access_Protocol" title="Internet Message Access Protocol">IMAP</a></li>
<li><a href="Internet_Printing_Protocol" title="Internet Printing Protocol">IPP</a></li>
<li><a href="IRC" title="IRC">IRC</a></li>
<li><a href="Lightweight_Directory_Access_Protocol" title="Lightweight Directory Access Protocol">LDAP</a></li>
<li><a href="Media_Gateway_Control_Protocol" title="Media Gateway Control Protocol">MGCP</a></li>
<li><a href="MQTT" title="MQTT">MQTT</a></li>
<li><a href="Network_News_Transfer_Protocol" title="Network News Transfer Protocol">NNTP</a></li>
<li><a href="Network_Time_Protocol" title="Network Time Protocol">NTP</a></li>
<li><a href="Open_Shortest_Path_First" title="Open Shortest Path First">OSPF</a></li>
<li><a href="Post_Office_Protocol" title="Post Office Protocol">POP</a></li>
<li><a href="Precision_Time_Protocol" title="Precision Time Protocol">PTP</a></li>
<li><a href="Open_Network_Computing_Remote_Procedure_Call" class="mw-redirect" title="Open Network Computing Remote Procedure Call">ONC/RPC</a></li>
<li><a href="Real-time_Transport_Protocol" title="Real-time Transport Protocol">RTP</a></li>
<li><a href="Real-Time_Streaming_Protocol" title="Real-Time Streaming Protocol">RTSP</a></li>
<li><a href="Routing_Information_Protocol" title="Routing Information Protocol">RIP</a></li>
<li><a href="Session_Initiation_Protocol" title="Session Initiation Protocol">SIP</a></li>
<li><a href="Simple_Mail_Transfer_Protocol" title="Simple Mail Transfer Protocol">SMTP</a></li>
<li><a href="Simple_Network_Management_Protocol" title="Simple Network Management Protocol">SNMP</a></li>
<li><a href="Secure_Shell" title="Secure Shell">SSH</a></li>
<li><a href="Telnet" title="Telnet">Telnet</a></li>
<li><a href="Transport_Layer_Security" title="Transport Layer Security">TLS/SSL</a></li>
<li><a href="XMPP" title="XMPP">XMPP</a></li>
<li><i>more...</i></li></ul></td>
</tr><tr><th class="sidebar-heading">
<a href="Transport_layer" title="Transport layer">Transport layer</a></th></tr><tr><td class="sidebar-content">
<ul><li><a href="Transmission_Control_Protocol" title="Transmission Control Protocol">TCP</a></li>
<li><a href="User_Datagram_Protocol" title="User Datagram Protocol">UDP</a></li>
<li><a href="Datagram_Congestion_Control_Protocol" title="Datagram Congestion Control Protocol">DCCP</a></li>
<li><a href="Stream_Control_Transmission_Protocol" title="Stream Control Transmission Protocol">SCTP</a></li>
<li><a href="Resource_Reservation_Protocol" title="Resource Reservation Protocol">RSVP</a></li>
<li><a href="QUIC" title="QUIC">QUIC</a></li>
<li><i>more...</i></li></ul></td>
</tr><tr><th class="sidebar-heading">
<a href="Internet_layer" title="Internet layer">Internet layer</a></th></tr><tr><td class="sidebar-content">
<ul><li><a href="Internet_Protocol" title="Internet Protocol">IP</a>
<ul><li><a href="IPv4" title="IPv4">v4</a></li>
<li><a href="IPv6" title="IPv6">v6</a></li></ul></li>
<li><a href="Internet_Control_Message_Protocol" title="Internet Control Message Protocol">ICMP</a> (<a href="ICMPv6" title="ICMPv6">v6</a>)</li>
<li><a href="Neighbor_Discovery_Protocol" title="Neighbor Discovery Protocol">NDP</a></li>
<li><a href="Explicit_Congestion_Notification" title="Explicit Congestion Notification">ECN</a></li>
<li><a href="Internet_Group_Management_Protocol" title="Internet Group Management Protocol">IGMP</a></li>
<li><a href="IPsec" title="IPsec">IPsec</a></li>
<li><i>more...</i></li></ul></td>
</tr><tr><th class="sidebar-heading">
<a href="Link_layer" title="Link layer">Link layer</a></th></tr><tr><td class="sidebar-content">
<ul><li><a href="Address_Resolution_Protocol" title="Address Resolution Protocol">ARP</a></li>
<li><a href="Tunneling_protocol" title="Tunneling protocol">Tunnels</a></li>
<li><a href="Point-to-Point_Protocol" title="Point-to-Point Protocol">PPP</a></li>
<li><a href="Medium_access_control" title="Medium access control">MAC</a></li>
<li><i>more...</i></li></ul></td>
</tr><tr><td class="sidebar-navbar"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></td></tr></tbody></table>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Features">Features</h2></div>
<p>Some features of TIPC:
</p>
<ul><li>Service addressing, - address services rather than sockets</li>
<li>Service tracking, - subscribe for binding/unbinding of service addresses to sockets</li>
<li>Cluster-wide IPC service, - service location is transparent to sender</li>
<li><a href="Datagram" title="Datagram">Datagram</a> messaging with unicast, anycast and multicast, - unreliable delivery</li>
<li><a href="Connection_oriented" class="mw-redirect" title="Connection oriented">Connection oriented</a> messaging, - reliable delivery</li>
<li>Group messaging, - datagram messaging with reliable delivery</li>
<li>Cluster topology tracking, - subscribe for added/lost cluster nodes</li>
<li>Connectivity tracking, - subscribe for up/down of individual links between nodes</li>
<li>Automatic discovery of new cluster nodes</li>
<li>Scales up to 1000 nodes with second-speed failure discovery</li>
<li>Implemented as in-tree kernel module at kernel.org</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Implementations">Implementations</h2></div>
<p>The TIPC protocol is available as a module in the mainstream <a href="Linux_kernel" title="Linux kernel">Linux kernel</a>,<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> and hence in most Linux distributions. The TIPC project also provides open source implementations of the protocol for other <a href="Operating_system" title="Operating system">operating systems</a> including Wind River's <a href="VxWorks" title="VxWorks">VxWorks</a> and Sun Microsystems' <a href="Solaris_(operating_system)" class="mw-redirect" title="Solaris (operating system)">Solaris</a>. TIPC applications are typically written in <a href="C_(programming_language)" title="C (programming language)">C</a> (or <a href="C%2B%2B" title="C++">C++</a>) and utilize sockets of the AF_TIPC address family. Support for <a href="Go_(programming_language)" title="Go (programming language)">Go</a>, <a href="D_(programming_language)" title="D (programming language)">D</a>, <a href="Perl" title="Perl">Perl</a>, <a href="Python_(programming_language)" title="Python (programming language)">Python</a>, and <a href="Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a> is also available.
</p>
<div class="mw-heading mw-heading2"><h2 id="Service_addressing">Service addressing</h2></div>
<p>A TIPC application may use three types of addresses.
</p>
<ul><li><i>Service Address</i>. This address type consists of a 32-bit service <i>type</i> identifier and a 32-bit service <i>instance</i> identifier. The type identifier is typically determined and hard coded by the user application programmer, but its value may have to be coordinated with other applications which might be present in the same cluster. The instance identifier is often calculated by the program, based on application specific criteria.</li></ul>
<ul><li><i>Service Range</i>. This address type represents a range of service addresses of the same type and with instances between a <i>lower</i> and an <i>upper</i> range limit. By binding a socket to this address type one can make it represent many instances, something which has proved useful in many cases.</li>
<li><i>Socket Address</i>. This address is a reference to a specific socket in the cluster. It contains a 32-bit <i>port number</i> and a 32-bit <i>node number</i>. The port number is generated by the system when the socket is created, and the node number is either set by configuration or, - from Linux 4.17, generated from the corresponding node identity. An address of this type can be used for connecting or for sending messages in the same way as service addresses can be used, but is only valid as long as the referenced socket exists.</li></ul>
<p>A socket can be bound to several different service addresses or ranges, just as different sockets can be bound to the same service address or range. Bindings are also qualified with a <i>visibility scope</i>, i.e., node local or cluster global visibility.
</p>
<div class="mw-heading mw-heading2"><h2 id="Datagram_messaging">Datagram messaging</h2></div>
<p>Datagram messages are discrete data units between 1 and 66,000 byte of length, transmitted between non-connected sockets. Just like their <a href="User_Datagram_Protocol" title="User Datagram Protocol">UDP</a> counterparts, TIPC datagrams are not guaranteed to reach their destination, but their chances of being delivered are still much better than for the former. Because of the link layer delivery guarantee, the only limiting factor for datagram delivery is the socket receive buffer size. The chances of success can also be increased by the sender, by giving his socket an appropriate delivery <i>importance</i> priority. Datagrams can be transmitted in three different ways.
</p>
<ul><li><i>Unicast</i>. If a socket address is indicated the message is transmitted to that exact socket. In TIPC the term <i>unicast</i> is reserved to denote this addressing mode.</li>
<li><i>Anycast</i>. When a service address is used, there might be several matching destinations, and the transmission method becomes what is often called <i>anycast</i>, i.e., that any of the matching destinations may be selected. The internal function translating from service address to socket address uses a <i>round-robin</i> algorithm to decrease the risk of load bias among the destinations.</li>
<li><i>Multicast</i>. The service range address type also doubles as <i>multicast address</i>. When an application specifies a service range as destination address, a copy of the message is sent to all matching sockets in the cluster. Any socket bound to a matching service instance inside the indicated multicast range will receive one copy of the message. TIPC multicast will leverage use of UDP multicast or Ethernet broadcast whenever possible.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Connection-oriented_messaging">Connection-oriented messaging</h2></div>
<p>Connections can be established the same way as with <a href="Transmission_Control_Protocol" title="Transmission Control Protocol">TCP</a>, by means of <code>accept()</code> and <code>connect()</code> on <style data-mw-deduplicate="TemplateStyles:r886049734">
/* start https://en.wikipedia.org/ */
.mw-parser-output .monospaced{font-family:monospace,monospace}
/* end https://en.wikipedia.org/ */
</style><span class="monospaced">SOCK_STREAM</span> sockets. However, in TIPC the client and server use service addresses or ranges instead of port numbers and IP addresses. TIPC does also provide two alternatives to this standard setup scenario.
</p>
<ul><li>The sockets can be created as SOCK_SEQPACKET, implying that data exchange must happen in units of maximum 66,000 byte messages.</li>
<li>A client can initialize a connection by simply sending a data message to an accepting socket. Likewise, the spawned server socket can respond with a data message back to the client to complete the connection. This way, TIPC provides an <i>implied</i>, also known as <i>0-RTT</i> connection setup mechanism that is particularly time saving in many cases.</li></ul>
<p>The most distinguishing property of TIPC connections is still their ability to react promptly to loss of contact with the peer socket, without resorting to active neighbor heart-beating.
</p>
<ul><li>When a socket is ungraciously closed, either by the user or because of a process crash, the kernel socket cleanup code will by its own initiative issue a FIN/ERROR message to the peer.</li>
<li>When contact to a cluster node is lost, the local link layer will issue FIN/ERROR messages to all sockets having connections towards that node. The peer node failure discovery time is configurable down to 50 ms, while the default value is 1,500 ms.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Group_messaging">Group messaging</h2></div>
<p>Group messaging is similar to datagram messaging, as described above, but with end-to-end flow control, and hence with delivery guarantee. There are however a few notable differences.
</p>
<ul><li>Messaging can only be done within a closed group of member sockets. </li>
<li>A socket joins a group by using a service address, where the <i>type</i> field indicates the <i>group identity</i> and the <i>instance</i> field indicates member identity. Hence, a member can only bind to one single service address.</li>
<li>When sending an <i>anycast</i> message, the lookup algorithm applies the regular round-robin algorithm, but also considers the current load, i.e., the advertised send window, on potential receivers before selecting one.</li>
<li><i>Multicast</i> is performed by a service address, not a range, so a copy of the sent message will reach all members which have joined the group with exactly that address.</li>
<li>There is a group <i>broadcast</i> mode which transmits a message to all group members, without considering their member identity.</li>
<li>Message sequentiality is guaranteed, even between the transmission modes.</li></ul>
<p>When joining a group, a member may indicate if it wants to receive <i>join</i> or <i>leave</i> events for other members of the group. This feature leverages the <i>service tracking</i> feature, and the group member will receive the events in the member socket proper.
</p>
<div class="mw-heading mw-heading2"><h2 id="Service_tracking">Service tracking</h2></div>
<p>An application accesses the tracking service by opening a connection to the TIPC internal topology server, using a reserved service address. It can then send one or more <i>service subscription messages</i> to the tracking service, indicating the service address or range it wants to track. In return, the topology service sends <i>service event messages</i> back to the application whenever matching addresses are bound or unbound by sockets within the cluster. A service event contains the found matching service range, plus the port and node number of the bound/unbound socket. There are two special cases of service tracking:
</p>
<ul><li><i>Cluster topology tracking</i>. When TIPC establishes contact with another node, it does internally create a node local binding, using a reserved service type, in the service binding table. This makes it possible for applications on the node to keep track of reachable peer nodes at any time.</li>
<li><i>Cluster connectivity tracking</i>. When TIPC establishes a new link to another node, it does internally create a node local binding, using a reserved service type, in the node's binding table. This makes it possible for applications on the node to keep track of all working links to the peer nodes at any time.</li></ul>
<p>Although most service subscriptions are directed towards the node local topology server, it is possible to establish connections to other nodes' servers and observe their local bindings. This might be useful if e.g., a connectivity subscriber wants to create a matrix of all connectivity across the cluster, - not limited to what can be seen from the local node.
</p>
<div class="mw-heading mw-heading2"><h2 id="Cluster">Cluster</h2></div>
<p>A TIPC network consists of individual processing elements or <i>nodes</i>. Nodes can be either physical processors, virtual machines or network namespaces, e.g., in the form of Docker Containers. Those nodes are arranged into a <i>cluster</i> according to their assigned <i>cluster identity</i>. All nodes having the same cluster identity will establish links to each other, provided the network is set up to allow mutual <i>neighbor discovery</i> between them. It is only necessary to change the cluster identity from its default value if nodes in different clusters potentially may discover each other, e.g., if they are attached to the same subnet. Nodes in different clusters cannot communicate with each other using TIPC.
</p>
<p>Before Linux 4.17, nodes must be configured a unique 32-bit <i>node number</i> or address, which must comply with certain restrictions. As from Linux 4.17, each node has a 128-bit <i>node identity</i> which must be unique within the node's cluster. The node number is then calculated as a guaranteed unique hash from that identity.
</p><p>If the node will be part of a cluster, the user can either rely on the <i>auto configuration capability</i> of the node, where the identity is generated when the first interface is attached, or he can set the identity explicitly, e.g., from the node's host name or a UUID. If a node will not be part of a cluster its identity can remain at the default value, zero.
</p><p>Neighbor discovery is performed by UDP multicast or L2 broadcast, when available. If broadcast/multicast support is missing in the infrastructure, discovery can be performed by explicitly configured IP addresses.
</p>
<div class="mw-heading mw-heading3"><h3 id="Inter-node_links">Inter-node links</h3></div>
<p>A cluster consists of nodes interconnected with one or two links. A link constitutes a reliable packet transport service, sometimes referred to as an "L2.5" data link layer.
</p>
<ul><li>It guarantees delivery and sequentiality for all packets.</li>
<li>It acts as a trunk for inter-node connections, and keeps track of those.
<ul><li>When all contact to the peer node is lost, sockets with connections to that peer are notified so they can break the connections.</li></ul></li>
<li>Each endpoint keeps track of the peer node's address bindings in the local replica of the service binding table.
<ul><li>When contact to the peer node is lost all bindings from that peer are purged and service tracking events issued to all matching subscribers.</li></ul></li>
<li>When there is no regular data packet traffic each link is actively supervised by probing/heartbeats.
<ul><li>Failure detection tolerance is configurable from 50 ms to 30 seconds, - default setting is 1.5 seconds.</li></ul></li>
<li>For performance and redundancy reasons it is possible to establish two links per node pair, - on separate network interfaces.
<ul><li>A link pair can be configured for load sharing or active-standby.</li>
<li>If a link fails there will be a disturbance-free failover to the remaining link, if any.</li></ul></li></ul>
<div class="mw-heading mw-heading3"><h3 id="Cluster_scalability">Cluster scalability</h3></div>
<p>Since Linux 4.7, TIPC comes with a unique, patent pending, auto-adaptive hierarchical neighbor monitoring algorithm. This <i>Overlapping Ring Monitoring</i> algorithm, in reality a combination of ring monitoring and the <a href="Gossip_protocol" title="Gossip protocol">Gossip protocol</a>, makes it possible to establish full-mesh clusters of up to 1000 nodes with a failure discovery time of 1.5 seconds, while it in smaller clusters can be made much shorter.
</p>
<div class="mw-heading mw-heading2"><h2 id="Transport_media">Transport media</h2></div>
<p>While designed to be able to use all kinds of transport media, as of May 2018 implementations support <a href="User_Datagram_Protocol" title="User Datagram Protocol">UDP</a>, <a href="Ethernet" title="Ethernet">Ethernet</a> and <a href="InfiniBand" title="InfiniBand">InfiniBand</a>. The VxWorks implementation also supports <a href="Shared_memory_(interprocess_communication)" class="mw-redirect" title="Shared memory (interprocess communication)">shared memory</a> which can be accessed by multiple instances of the operating system, running simultaneously on the same hardware.
</p>
<div class="mw-heading mw-heading2"><h2 id="Security">Security</h2></div>
<p>Security must currently be provided by the transport media carrying TIPC. When running across UDP, IPSec can be used, when on Ethernet, MACSec is the best option. The TIPC team is currently looking into how to support TLS or DTLS, ether natively or by an addition to OpenSSL.
</p>
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p>This protocol was originally developed by Jon Paul Maloy at <a href="Ericsson" title="Ericsson">Ericsson</a> during 1996–2005 and was used by that company in cluster applications for several years, before subsequently being released to the <a href="Open-source_model" class="mw-redirect" title="Open-source model">open source</a> community and integrated in the mainstream Linux kernel. It has since then undergone numerous improvements and upgrades, all performed by a dedicated TIPC project team with participants from various companies. The management tool for TIPC is part of the <i>iproute2</i> tool package which comes as standard with all Linux distributions.
</p>
<div class="mw-heading mw-heading2"><h2 id="Reference">Reference</h2></div>
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.tipc.io/intro.html">"TIPC introduction"</a>. <i>tipc.io</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2025-06-22</span></span>.</cite></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/configuring_and_managing_networking/getting-started-with-tipc_configuring-and-managing-networking">"Chapter 50. Getting started with TIPC"</a>. <i>RedHat document</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2025-07-18</span></span>.</cite></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://github.com/torvalds/linux/blob/master/include/net/tipc.h">"TIPC in linux repository"</a>. <i>Github</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2025-06-22</span></span>.</cite></span>
</li>
</ol></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a href="Iproute2" title="Iproute2">Iproute2</a></li>
<li><a rel="nofollow" class="external text" href="https://wiki.linuxfoundation.org/networking/iproute2">IProute2</a> website</li>
<li><a rel="nofollow" class="external text" href="http://www.tipc.io/">TIPC Home Page</a></li>
<li><a rel="nofollow" class="external text" href="https://sourceforge.net/projects/tipc/">TIPC Project Page</a> at <a href="SourceForge" title="SourceForge">SourceForge</a></li>
<li><a rel="nofollow" class="external text" href="https://sourceforge.net/projects/tipc/files/">Demos and Utilities</a> downloads at SourceForge</li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Inter-process_communication278" style="padding:3px"><table class="nowraplinks mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="2"><div id="Inter-process_communication278" style="font-size:114%;margin:0 4em"><a href="Inter-process_communication" title="Inter-process communication">Inter-process communication</a></div></th></tr><tr><td class="navbox-abovebelow" colspan="2"><div><a href="Data" title="Data">Data</a> exchange among <a href="Thread_(computing)" title="Thread (computing)">threads</a> in <a href="Computer_program" title="Computer program">computer programs</a></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Methods</th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Computer_file" title="Computer file">File</a></li>
<li><a href="Mmap" title="Mmap">Memory-mapped file</a></li>
<li><a href="Message_passing" title="Message passing">Message passing</a></li>
<li><a href="Message_queue" title="Message queue">Message queue and mailbox</a></li>
<li><a href="Named_pipe" title="Named pipe">Named pipe</a></li>
<li><a href="Anonymous_pipe" title="Anonymous pipe">Anonymous pipe</a></li>
<li><a href="Pipeline_(Unix)" title="Pipeline (Unix)">Pipe</a></li>
<li><a href="Semaphore_(programming)" title="Semaphore (programming)">Semaphore</a></li>
<li><a href="Shared_memory" title="Shared memory">Shared memory</a></li>
<li><a href="Signal_(IPC)" title="Signal (IPC)">Signal</a></li>
<li>Sockets
<ul><li><a href="Network_socket" title="Network socket">Network</a></li>
<li><a href="Unix_domain_socket" title="Unix domain socket">Unix</a></li></ul></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Communication_protocol" title="Communication protocol">Protocols</a><br>and <a href="Technical_standard" title="Technical standard">standards</a></th><td class="navbox-list-with-group navbox-list navbox-even hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Apple_event" title="Apple event">Apple events</a></li>
<li><a href="Component_Object_Model#COM.2B" title="Component Object Model">COM+</a></li>
<li><a href="Common_Object_Request_Broker_Architecture" title="Common Object Request Broker Architecture">CORBA</a></li>
<li><a href="D-Bus" title="D-Bus">D-Bus</a></li>
<li><a href="Data_Distribution_Service" title="Data Distribution Service">DDS</a></li>
<li><a href="Distributed_Computing_Environment" title="Distributed Computing Environment">DCE</a></li>
<li><a href="Internet_Communications_Engine" title="Internet Communications Engine">ICE</a></li>
<li><a href="OpenBinder" title="OpenBinder">OpenBinder</a></li>
<li><a href="Sun_RPC" title="Sun RPC">Sun RPC</a></li>
<li><a href="POSIX" title="POSIX">POSIX</a> (various methods)</li>
<li><a href="SOAP" title="SOAP">SOAP</a></li>
<li><a href="REST" title="REST">REST</a></li>
<li><a href="Apache_Thrift" title="Apache Thrift">Thrift</a></li>
<li><a href="XML-RPC" title="XML-RPC">XML-RPC</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Library_(computing)" title="Library (computing)">Software libraries</a><br>and <a href="Software_framework" title="Software framework">frameworks</a></th><td class="navbox-list-with-group navbox-list navbox-odd hlist" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="D-Bus" title="D-Bus">D-Bus</a></li>
<li><a href="Libevent" title="Libevent">libevent</a></li>
<li><a href="SIMPL" title="SIMPL">SIMPL</a></li>
<li><a href="LINX_(IPC)" class="mw-redirect" title="LINX (IPC)">LINX</a></li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-07-18" href="https://en.wikipedia.org/wiki/?title=Transparent_Inter-process_Communication&oldid=1301174134">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>